﻿#ifndef GAMEMODEL_H
#define GAMEMODEL_H
#include<vector>

//游戏类型：双人还是AI
enum GameType{
    TwoMan,//自娱自乐
    AI//人机对弈
};
enum GameStatus{
    PLAYING,//游戏中
    WIN,//胜利
    LOSE//失败
};

//以下为五子棋设置
const int BOARD_GRAD_SIZE=15;//棋盘大小
const int MARGIN=30;//棋子半径
const int MARK_SIZE=10;//落子标记边长 移动光标时的辅助光标大小
const int BLOCK_SIZE=40;//格子大小
const int POS_OFFSET=BLOCK_SIZE*0.3;//鼠标点击的模糊距离上限
const int AI_THINK_TIME=400;//AI下棋间隔
const int Preview_MARGIN=10;//预落子点大小

//以下为孔明棋设置

const int BOARD_GRAD_SIZE2=7;//棋盘大小
const int MARGIN2=30;//棋子直径 也是棋盘上边界距离窗口的距离
const int MARK_SIZE2=10;//落子标记边长 移动光标时的辅助光标大小
const int BLOCK_SIZE2=40;//格子大小
const int POS_OFFSET2=BLOCK_SIZE2*0.3;//鼠标点击的模糊距离上限

class GameModel{
public:
    GameModel(){};//空构造函数就行了
    //存储当前游戏棋盘和棋子的情况，空白为0，黑子为1，白字为-1
    std::vector<std::vector<int>>gameMapVec;//二维vector数组
    //存储各个点位的评分情况，作为AI下棋依据
    std::vector<std::vector<int>>scoreMapVec;

    //标示下棋方，true：黑棋方  false：AI 白棋方
    bool playerFlag;
    GameType gameType;//定义游戏模式
    GameStatus gameStatus;//游戏状态
    int initialPieceX=-1;int initialPieceY=-1;//孔明棋初始取走的棋子坐标
    void startGame(GameType type);//五子棋开始游戏
    void startGame2();//孔明棋开始游戏

    void actionByPerson(int row,int col);//人下棋位置

    void updateGameMap(int row,int col);//打印棋盘，每下子一次打印一次棋盘
    void actionByPerson2(int row,int col);//孔明棋

    void updateGameMap2(int row,int col);//孔明棋打印棋盘，每下子一次打印一次棋盘
    bool isWIn(int row,int col);//判断游戏胜负
    bool isDeadGame();//判断是否和棋
    void calculateScore();//评分
    void actionByAI(int &clickRow,int &clickCol);//人机下棋位
    // 孔明棋 寻找选中的附近是否有可下子 并把可下位置标记为-2
    void findDropLocation(int row,int col);
    //孔明棋 处理烂摊子 消除先前标记的除落下子以外的-2 以及将移动前的坐标标记为0
    void treatPreLocate(int prerow,int precol,int row,int col);
    //孔明棋 判断分数以及是否游戏结束 遍历棋盘现存所有棋子 调用findDropLocation函数
    bool judgeWin();
    int finalResult();
    void sameLocate(int prerow,int precol);//假设再次点击白子
};
#endif // GAMEMODEL_H
